package cn.tedu.web.service.impl;

import cn.tedu.web.entity.User;
import cn.tedu.web.mapper.UserMapper;
import cn.tedu.web.service.IUserService;
import cn.tedu.web.utils.EmailTemplateUtil;
import cn.tedu.web.utils.Sender;

import java.io.UnsupportedEncodingException;

import javax.mail.MessagingException;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author issen
 * @since 2021-09-17
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
    @Autowired
    private UserMapper mapper;

    /**
	 * 注册
	 * @param email 注册的邮箱
	 * @param password 账号的密码
	 * @param nickname 昵称
	 */
	public String register(String email, String password, String nickname) {
		if (StringUtils.isAnyBlank(email, password)) {
			// 如果邮箱或者密码为空，则返回提示
			return "NOT_EMPTY";
		}
		// 当前端没有提交昵称的参数时，以邮箱作为昵称
		nickname = StringUtils.isEmpty(nickname) ? email : nickname;
		// 1. 检查邮箱是否存在
		Boolean exists = mapper.exists(email);
		if (Boolean.TRUE.equals(exists)) {
			// 如果存在，则不允许注册
			return "EMAIL_EXISTS";
		}
		// 2. 插入数据到数据库
		User user = new User();
		user.setEmail(email);
		user.setPassword(password);
		user.setNickname(nickname);
		mapper.insert(user);
		// 3. 发送一个激活的邮箱，让用户到自己的邮箱点击链接来激活
		// 发件人
		String address = "m15197193512@yeah.net";
		// 发件人授权码
		String code = "GQZYBWVHCGVQKMKM";
		// 发件人姓名
		String name = "班德尔商城";
		// 邮件主题
		String subject = "账号激活";
		// 收件人
		String to = email;
		// 邮件内容
		String content = EmailTemplateUtil.get(nickname, "http://localhost:8000/active?id=" + user.getId());

		// SMTP 主机
		String host = "smtp.yeah.net";
		// SMTP 端口
		String port = "465";

		try {
			Sender.sendMessage(subject, content, address, code, name, to, null, null, host, port, null, true);
		} catch (MessagingException e) {
			e.printStackTrace();
			return "MessagingException";
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			return "UnsupportedEncodingException";
		}
		return "OK";
	}

	/**
	 * 激活账号
	 * @param id
	 * @return
	 */
	public String active(Integer id) {
		Integer affectRow = mapper.activeStatus(id);
		return affectRow != null && affectRow > 0 ? "OK" : "NO";
	}

	/**
	 * 根据邮箱和密码获取用户的ID
	 * @param email 邮箱
	 * @param password 密码
	 * @return 返回 null，说明账号和密码不匹配，返回负数，说明账号不存在，返回正数，说明账号和密码匹配
	 */
	public Integer findUserByEmailAndPassword(String email, String password) {
		Boolean exists = mapper.exists(email);
		if (!Boolean.TRUE.equals(exists)) {
			// 如果 exists 为假，则说明用户不存在，返回负数
			return -1;
		}
		return mapper.findUserByEmailAndPassword(email, password);
	}

	/**
	 * 根据ID获取用户的昵称
	 * @param id 用户的ID
	 */
	public String findNickNameById(Integer id) {
		if (id == null || id < 1) {
			return null;
		}
		return mapper.findNickNameById(id);
	}
}
